Firewalld 笔记
Table of Contents
1. 基础用法
sudo systemctl start firewalld
启动服务。
sudo systemctl enable firewalld
服务开机自启动。
sudo systemctl stop firewalld
停止服务。
sudo systemctl disable firewalld
取消开机自启动。
sudo systemctl status firewalld
查看 firewalld 守护进程的状态。
sudo firewall-cmd --state
检查防火墙状态。输出应该是 running 或者 not running 。
sudo firewall-cmd --reload
重新加载 firewalld 配置。
2. 配置 firewalld
firewalld 使用 XML 进行配置,配置文件位于两个目录中:
- /usr/lib/firewalld 下保存默认配置,如默认区域和公用服务。每次 firewall 软件包更新时都会覆盖这些文件,所以不要改这里的文件。
- /etc/firewalld 下保存系统配置文件。这些文件将覆盖默认配置。自己写的配置文件要放在这里。
3. 配置集
firewalld 使用 runtime 和 persistent 两个配置集。系统重新启动或 firewalld-cmd --reload
时,不会保留 runtime 的配置更改,而对 persistent 配置集的更改不会应用于正在运行的系统。
默认情况下,firewall-cmd 命令适用于 runtime 配置,但在命令后加 --permanent
参数可以将配置保存到 persistent 配置中。要添加和激活 persistent 规则,可以使用下面两种方法之一。
- 将规则同时添加到 runtime 和 persistent 规则集中:
sudo firewall-cmd --zone=public --add-service=http --permanent sudo firewall-cmd --zone=public --add-service=http
- 将规则添加到 persistent 规则集中并重载 firewalld:
sudo firewall-cmd --zone=public --add-service=http --permanent sudo firewall-cmd --reload
--reload
命令会删除所有 runtime 配置并应用 persistent 配置。又因为 firewalld 动态管理规则集,所以它不会破坏现有的连接和会话。
4. 防火墙的 zone
zone ( 区域 ) 是针对给定位置或场景 ( 例如家庭、公共、受信任等 ) 可能具有的各种信任级别的预构建规则集。不同的 zone 允许不同的网络服务和入站流量类型,而拒绝其他任何流量。首次启用 firewalld 后, public 将是默认 zone。
zone 也可以用于不同的网络接口。例如,要分离内部网络和互联网的接口,你可以在 internal zone 上允许 DHCP,但在 external zone 仅允许 HTTP 和 SSH。未明确设置为特定区域的任何接口将添加到默认 ( public ) zone。
sudo firewall-cmd --get-default-zone
会输出默认 zone。
sudo firewall-cmd --set-default-zone=internal
可以修改默认 zone。
sudo firewall-cmd --get-active-zones
查看网络接口使用的 zone。
sudo firewall-cmd --zone=public --list-all
显示特定 zone 的所有配置。
sudo firewall-cmd --list-all-zones
显示所有 zone 的配置。
5. 自定义 service
firewalld 可以根据特定网络 service 的预定义规则来允许相关流量。用户可以创建自己的系统规则,并将它们添加到任何 zone。默认支持的 service 的配置文件位于 /usr/lib/firewalld/services,用户创建的服务文件要被放在 /etc/firewalld/services 中。
sudo firewall-cmd --get-services
查看默认的可用 service。
sudo firewall-cmd --zone=public --add-service=http --permanent
启用名为 http 的服务。
sudo firewall-cmd --zone=public --remove-service=http --permanent
禁用名为 http 的服务。
6. 允许或者拒绝某个端口 / 协议
sudo firewall-cmd --list-ports
显示目前已经被允许连接的端口及对应协议。
sudo firewall-cmd --zone=public --add-port=12345/tcp --permanent
允许 12345 端口的 TCP 流量。
sudo firewall-cmd --zone=public --add-port=12345/udp --permanent
允许 12345 端口的 UDP 流量。
sudo firewall-cmd --zone=public --remove-port=12345/tcp --permanent
禁用 12345 端口的 TCP 流量。
sudo firewall-cmd --zone=public --remove-port=12345/udp --permanent
禁用 12345 端口的 UDP 流量。
7. 端口转发
将本机 80 端口的流量转发到本机 12345 端口:
sudo firewall-cmd --zone="public" --add-forward-port=port=80:proto=tcp:toport=12345
将本机流量转发到另外一台服务器上:
- 在需要的区域中激活 masquerade:
sudo firewall-cmd --zone=public --add-masquerade
- 添加转发规则。比如,将本机 80 端口的流量转发到 IP 地址为 123.456.78.9 的服务器的 8080 端口上。
sudo firewall-cmd --zone=public --add-forward-port=port=80:proto=tcp:toport=8080:toaddr=123.456.78.9
删除规则,用 --remove
替换 --add
。比如: sudo firewall-cmd --zone=public --remove-masquerade
8. 用 firewalld 构建规则集
给一个例子,使用 firewalld 构建一个新的 zone 并配置其中的规则:
- 将 eth0 的默认区域设置为 dmz。在所提供的默认区域中,dmz ( 非军事区 ) 是最适合于这个程序的,因为它只允许 SSH 和 ICMP。
sudo firewall-cmd --set-default-zone=dmz sudo firewall-cmd --zone=dmz --add-interface=eth0
- 把 HTTP 和 HTTPS 添加永久的服务规则到 dmz 区域中:
sudo firewall-cmd --zone=dmz --add-service=http --permanent sudo firewall-cmd --zone=dmz --add-service=https --permanent
- 重新加载 firewalld 让规则立即生效:
sudo firewall-cmd --reload
如果运行 firewall-cmd --zone=dmz --list-all
会有下面的输出:
dmz (default) interfaces: eth0 sources: services: http https ssh ports: masquerade: no forward-ports: icmp-blocks: rich rules:
输出显示,dmz zone 是默认 zone,它被用于 eth0 接口中所有网络的源地址和端口。允许传入 HTTP ( 端口 80 )、HTTPS ( 端口 443 ) 和 SSH ( 端口 22 ) 的流量,并且由于没有 IP 版本控制的限制,所以 IPv4 和 IPv6 流量都适用于这个 zone。不允许 IP 伪装以及端口转发。我们没有 ICMP 块,所以 ICMP 流量是完全允许的。没有 Rich rules,意思是允许所有出站流量。